package control.informes;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import javax.swing.JFileChooser;
import javax.swing.JOptionPane;

import com.lowagie.text.Cell;
import com.lowagie.text.Chunk;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.Font;
import com.lowagie.text.FontFactory;
import com.lowagie.text.ListItem;
import com.lowagie.text.PageSize;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;

public abstract class Informe {
	protected final Font NORMAL = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12);
	protected final Font NEGRITA = FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.BOLD);
	protected final Font TITULO = FontFactory.getFont(FontFactory.TIMES_ROMAN, 14, Font.BOLD);
	protected final Font TITULOPRINCIPAL = FontFactory.getFont(FontFactory.TIMES_ROMAN, 16, Font.BOLD);

	Document document = null;

	public Informe(ModeloInforme modelo) {
		// Seleccion del fichero
		String fileName = seleccionarFichero();
		if (fileName == null)
			return;
		
		// Creacion del documento
		crearDocumento(fileName);

		// Insercion del contenido
		try {
			insertarContenido(document, modelo);
		} catch (DocumentException e) {
			JOptionPane.showMessageDialog(null, e.getMessage());
		}

		// Finalizacion del informe
		cerrarDocumento();
	}

	private String seleccionarFichero() {
		JFileChooser jfc = new JFileChooser();
		if (jfc.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
			File file = jfc.getSelectedFile();
			String fileName = file.getPath();
			if (!fileName.endsWith(".pdf"))
				fileName += ".pdf";
			return fileName;
		}
		return null;
	}

	private Document crearDocumento(String fileName) {
		// Documento con dimension y margenes
		document = new Document(PageSize.A4, 50, 50, 50, 50);

		try {
			PdfWriter.getInstance(document, new FileOutputStream(fileName));
		} catch (FileNotFoundException e) {
			JOptionPane.showMessageDialog(null, e.getMessage());
		} catch (DocumentException e) {
			JOptionPane.showMessageDialog(null, e.getMessage());
		}

		// Apertura del documento para meter contenido
		document.open();

		return document;
	}

	protected abstract void insertarContenido(Document report, ModeloInforme modelo) throws DocumentException;

	protected Cell cabecera(String texto, int cs, int rs) {
		Cell cabecera = new Cell(texto);
		cabecera.setHeader(true);
		cabecera.setColspan(cs);
		cabecera.setRowspan(rs);
		cabecera.setBorderWidth(1);
		return cabecera;
	}

	protected Cell celda(String texto) {
		Cell celda = new Cell(texto);
		celda.setBorderWidth(0);
		return celda;
	}
	
	protected ListItem dato(String nombre, String valor){
		ListItem listItem = new ListItem(nombre+":", NEGRITA);
		listItem.add(new Chunk(valor, NORMAL));
		return listItem;
	}

	protected void insertaBloque(Document report, String Titulo, Element contenido) throws DocumentException {
		Paragraph pt = new Paragraph(Titulo, TITULO);
		pt.setSpacingBefore(10);
		report.add(pt);
		report.add(contenido);
	}

	private void cerrarDocumento() {
		document.close();
	}
}
